Indice


Progetto scelto: 5


Presentazione problema

In questo report, ci siamo concentrati sull’elaborazione di un modello lineare predittivo per determinare il numero di vittorie in funzione dei rimbalzi annuali effettuati dalle squadre nella NBA. Il modello si applica esclusivamente a squadre che hanno disputato almeno 82 partite per stagione, considerando un arco temporale che va dal 1976 al 2011.

L’approccio del modello lineare si basa sull’adozione di coefficienti accuratamente selezionati, mirati a massimizzare la significatività e l’aderenza alla nostra interpretazione dell’impatto di specifiche variabili sulle vittorie. Questi coefficienti sono stati scelti in modo da riflettere al meglio la nostra concezione di quali fattori influenzino maggiormente il successo delle squadre.

Ulteriori informazioni riguardanti l’esecuzione del programma e l’utilizzo della funzione predittiva sono fornite nei paragrafi successivi, dove viene anche descritto il processo di sviluppo e validazione del modello.


Analisi dati iniziale e grafici

Il chunk riportato legge un dataset da un file, filtra le righe in base ai criteri sopra riportati, calcola una nuova variabile e offre la possibilità di ottenere un riassunto statistico dei dati filtrati.

# Leggi il dataset da un file di testo
filepath <- here("0_Materiale", "basketball_teams.txt")
dataset <- read.delim(filepath)

# Definisci il primo e l'ultimo anno del range da considerare per lo studio
FIRST <- 1976
LAST <- 2011

# Filtra il dataset secondo le condizioni specificate
df <- dataset[dataset$lgID == "NBA" & dataset$year >= FIRST & dataset$year <= LAST & dataset$games == 82,]

# Converti la colonna lgID in un fattore per consentire la generazione di variabili dummy
dataset$lgID <- as.factor(dataset$lgID)

# Stampiamo un riassunto statistico del dataframe filtrato
# summary(df)

Correlazione dati

La mappa di calore della matrice di correlazione, o “corrplot”, è un metodo visivo efficace per esaminare le relazioni bivariate tra tutte le variabili di un dataset. In questo particolare corrplot, ogni cella rappresenta il coefficiente di correlazione tra le variabili sulle righe e le colonne. Le tonalità di colore variano in base alla forza e alla direzione della correlazione:

  • Le tonalità più scure di viola indicano una correlazione negativa forte o nessuna correlazione.
  • Le tonalità più chiare di arancione o bianco indicano una correlazione positiva.

L’asse delle ordinate (Y) e l’asse delle ascisse (X) elencano le variabili incluse nel dataset, permettendo di identificare rapidamente quali coppie di variabili mostrano le correlazioni più forti. Ad esempio, una cella chiara sulle diagonali rappresenta la perfetta correlazione positiva di una variabile con sé stessa, mentre le altre celle off-topic permettono di vedere come ogni variabile si relaziona con le altre.

Questa rappresentazione grafica è particolarmente utile per identificare potenziali problemi di multicollinearità in modelli di regressione, dove variabili altamente correlate possono distorcere o influenzare eccessivamente i risultati. Inoltre, può aiutare a scoprire pattern interessanti nei dati che potrebbero meritare ulteriori indagini.

Analisi vittorie

Boxplot

Il grafico presentato è un insieme di box plot, una rappresentazione grafica utilizzata per evidenziare la distribuzione e la variabilità delle vittorie per diverse squadre sportive, ognuna codificata con un colore distinto. Il box plot visualizza cinque statistiche descrittive principali: il minimo, il primo quartile (Q1), la mediana, il terzo quartile (Q3) e il massimo. La linea che attraversa il box rappresenta la mediana, il valore centrale del dataset. Le “antenne” si estendono dal box fino ai valori minimi e massimi esclusi gli outliers, che sono rappresentati come punti individuali. Questo tipo di grafico è particolarmente utile per confrontare le distribuzioni tra più gruppi e per identificare eventuali deviazioni significative dalla norma.

Dall’analisi del box plot si osserva un’ampia variazione nel numero di vittorie tra le squadre. Alcune squadre dimostrano una maggiore coerenza nelle prestazioni, come evidenziato da box più stretti, mentre altre presentano una maggiore dispersione dei risultati, suggerendo una variabilità significativa nelle loro prestazioni durante la stagione. Gli outliers indicano delle prestazioni eccezionali o sotto la media rispetto al resto del campione. La mediana di ciascuna squadra offre una valutazione robusta delle loro prestazioni tipiche escludendo l’influenza di tali valori anomali.

Densità

Il secondo grafico è un diagramma di densità, il quale fornisce una stima continua della distribuzione di probabilità delle vittorie complessive. La linea curva riflette la densità di probabilità, dove picchi più alti corrispondono a un numero maggiore di osservazioni vicine a un particolare valore. La linea rossa verticale indica la media delle vittorie, fornendo un punto di riferimento per la posizione centrale della distribuzione.

Osservando il diagramma di densità, si nota che la distribuzione delle vittorie complessive assume una forma approssimativamente simmetrica attorno alla media, indicata dalla linea rossa verticale. Questo suggerisce che, per il campione in esame, le vittorie sono distribuite in modo relativamente uniforme intorno al valore medio, con una tendenza a seguire una distribuzione normale. Tale simmetria e il picco pronunciato attorno alla media possono implicare che le prestazioni delle squadre tendono a raggrupparsi intorno a un ‘valore tipico’, con deviazioni che seguono un modello prevedibile.

Analisi rimbalzi

Nel nostro dataframe sono incluse variabili specifiche per analizzare in dettaglio il ruolo dei rimbalzi nel basket. Ecco una descrizione degli acronimi utilizzati:

  • o_oreb: Rimbalzi ottenuti in attacco
    • Questo valore rappresenta il numero di volte in cui una squadra recupera la palla dopo un tiro mancato mentre è in fase offensiva. È un indicatore diretto dell’aggressività e dell’efficacia offensiva di una squadra.
  • o_dreb: Rimbalzi subiti in attacco
    • Indica il numero di rimbalzi che una squadra concede all’avversario mentre è in attacco. Un valore più basso suggerisce una maggiore capacità di mantenere il controllo della palla dopo un tiro mancato.
  • o_reb: Totale rimbalzi in attacco
    • Questa è la somma dei rimbalzi ottenuti e subiti in attacco. Fornisce una misura complessiva dell’attività di rimbalzo di una squadra quando è in fase offensiva.
  • d_oreb: Rimbalzi subiti in difesa
    • Rappresenta il numero di rimbalzi che una squadra permette all’avversario di ottenere mentre è in difesa. Minimizzare questo numero è cruciale per prevenire seconde opportunità di punteggio per l’avversario.
  • d_dreb: Rimbalzi ottenuti in difesa
    • Indica il numero di volte in cui una squadra recupera la palla dopo un tiro mancato dall’avversario mentre è in difesa. È un indicatore chiave dell’efficacia difensiva e della capacità di interrompere l’attacco avversario.
  • d_reb: Totale rimbalzi in difesa
    • Questo è il totale dei rimbalzi che una squadra ottiene o concede mentre è in difesa. Offre una visione olistica dell’impegno e dell’efficacia di una squadra nel controllare la zona difensiva durante il gioco.

Densità variabili singole

Gli istogrammi delle variabili (di cui abbiamo approssimato la curva di densità) che ora vediamo rappresentano la distribuzione dei dati per diverse variabili, mostrando la frequenza o la probabilità di osservazione entro intervalli specifici. Le curve di densità forniscono una stima continua della distribuzione di probabilità e sono spesso confrontate con una distribuzione normale, indicata da una linea rossa.

Dai grafici osservati, è possibile trarre conclusioni riguardo la normalità della distribuzione dei dati per ciascuna variabile. Se la curva di densità blu segue da vicino la linea rossa della distribuzione normale, ciò implica che i dati di quella variabile potrebbero essere ben modellati da una distribuzione normale. Deviazioni significative da questa linea potrebbero indicare asimmetria o presenza di outlier. Tali informazioni sono vitali per la scelta di test statistici appropriati e per la comprensione delle caratteristiche fondamentali dei dati analizzati.

Percentuale di valori non zero per ciascuna variabile di interesse

Viene Calcolata la percentuale di valori non zero per ciascuna variabile di interesse all’interno del dataframe df_reb, serve per verificare ulteriormente la consistenza dei dati acqusiti.

## [1] "Percentage non-zero o_oreb:  100"
## [1] "Percentage non-zero o_dreb:  100"
## [1] "Percentage non-zero o_reb:  100"
## [1] "Percentage non-zero d_oreb:  100"
## [1] "Percentage non-zero d_dreb:  100"
## [1] "Percentage non-zero d_reb:  100"

Heatmap

Il grafico presentato è una combinazione di heatmap e dendrogramma. La heatmap è una rappresentazione visiva dei dati dove i valori individuali contenuti in una matrice sono rappresentati come colori. In questo caso, è probabile che i colori rappresentino l’intensità dei rimbalzi (offensivi e difensivi) di squadre sportive, mentre i dendrogrammi ai lati rappresentano una gerarchia di clustering basata sulla somiglianza delle prestazioni tra le squadre. Questo tipo di visualizzazione permette di identificare rapidamente modelli, come gruppi di squadre con prestazioni simili, e correlazioni tra i diversi tipi di rimbalzi.

L’analisi della heatmap e del dendrogramma indica l’esistenza di distinti gruppi di squadre che mostrano pattern simili nei rimbalzi. I cluster formati nel dendrogramma evidenziano relazioni che non sarebbero immediatamente ovvie senza questa forma di analisi gerarchica. Le gradazioni di colore nella heatmap offrono una visione intuitiva dell’intensità dei rimbalzi: colori più caldi indicano un numero maggiore di rimbalzi, mentre colori più freddi ne indicano di meno. Questo permette di identificare facilmente le squadre con prestazioni eccezionali o sottotono.

Barplot

Il secondo grafico è un diagramma a barre sovrapposte che confronta due variabili categoriche: i rimbalzi offensivi e difensivi per ogni squadra, rappresentati con colori distinti. Le barre verticali mostrano il numero totale di rimbalzi per ciascuna squadra, permettendo di comparare direttamente i rimbalzi offensivi con quelli difensivi.

L’esame del grafico a barre sovrapposte non rivela variazioni significative nel rapporto tra rimbalzi offensivi e difensivi tra le squadre, mostrando una tendenza all’auto-bilanciamento tra le due.

Densità

Il terzo grafico è un diagramma di densità che confronta la distribuzione totale dei rimbalzi con una distribuzione normale ideale. La densità è mostrata dalla curva blu, mentre la distribuzione normale ideale è rappresentata dalla linea verde (con area sottostante). La linea rossa tratteggiata indica la media dei rimbalzi totali.

Analizzando il diagramma di densità, si osserva che la distribuzione dei rimbalzi totali segue abbastanza fedelmente una distribuzione normale, come indicato dalla sovrapposizione delle due curve. La media, indicata dalla linea rossa, cade quasi al centro della curva di densità, suggerendo che la maggior parte delle squadre ha un numero di rimbalzi vicino alla media del campione.

Boxplot

L’ultimo grafico è un insieme di box plot, simile al primo grafico condiviso, ma questa volta per rimbalzi offensivi e difensivi. Ogni squadra è rappresentata da due box plot adiacenti, uno per i rimbalzi offensivi (o_reb) e uno per i rimbalzi difensivi (d_reb), permettendo un confronto immediato tra le due metriche per ogni squadra.

Il grafico mostra che c’è variabilità sia nei rimbalzi offensivi sia in quelli difensivi tra le diverse squadre. Si notano differenze nella mediana, nella variabilità e nella presenza di valori anomali (outliers), il che potrebbe indicare diverse efficacie o stili di gioco. Ad esempio, alcune squadre potrebbero avere una forte tendenza ai rimbalzi difensivi ma meno capacità nei rimbalzi offensivi, o viceversa, fornendo spunti per ulteriori indagini sulle strategie di gioco.

Test

Test Anderson-Darling

Il test Anderson-Darling è un test statistico non parametrico, utilizzato per verificare l’ipotesi che un campione di dati provenga da una particolare distribuzione, in questo caso, la distribuzione normale. È particolarmente sensibile alle deviazioni nella coda della distribuzione.
- Range: 0 a \(+\infty\)
- Interpretazione: Valori più bassi indicano una maggiore aderenza alla distribuzione normale. Si confronta il valore di test con valori critici specifici per determinare se rifiutare l’ipotesi di normalità.

# Questo codice esegue il test di Anderson-Darling sulla variabile 'reb' nel tuo dataset (df)
ad.test(df$reb)
## 
##  Anderson-Darling normality test
## 
## data:  df$reb
## A = 3.6997, p-value = 3.1e-09

Con un livello di significatività (\(\alpha\)) di 0.01 e un p-value molto piccolo (3.1e-09) ottenuto dal test di normalità di Anderson-Darling per i dati della variabile df$reb, si puo concludere che si hanno sufficienti evidenze statistiche per respingere lipotesi nulla che i dati seguano una distribuzione normale. Con il livello di significatività del 0.01 e il p-value molto piccolo (3.1e-09), il p-value è inferiore al livello di significatività, quindi si respinge lipotesi nulla. Questo suggerisce che i dati nella variabile df$reb non seguono una distribuzione normale al livello di significatività del 0.01. In termini più pratici, si hanno abbastanza evidenze statistice per concludere che la variabile df$reb non segue una distribuzione normale.

Test Kolmogorov-Smirnov

Il test Kolmogorov-Smirnov (K-S) è un metodo non parametrico utilizzato per determinare se un campione di dati segue una specifica distribuzione, in questo caso, la distribuzione normale. È ampiamente impiegato per la sua generalità e la facilità di implementazione.
- Range: 0 a 1
- Interpretazione: Valori più bassi indicano una maggiore somiglianza alla distribuzione normale. Un valore di test significativamente grande porta al rifiuto dell’ipotesi di normalità.

# Test di Kolmogorov-Smirnov per confrontare la distribuzione di 'reb' con una distribuzione normale
ks.test(df$reb, "pnorm")
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  df$reb
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Il test KS confronta la distribuzione empirica dei dati con una distribuzione teorica (spesso una distribuzione uniforme). In breve, il risultato suggerisce che i nostri dati non seguono la distribuzione teorica normale presunta, e cè un elevata probabilità che la differenza osservata sia statisticamente significativa.

Test Shapiro-Wilk

Il test Shapiro-Wilk è un metodo statistico non parametrico utilizzato specificatamente per testare la normalità di un campione di dati. È noto per la sua affidabilità e precisione, soprattutto in campioni di dimensioni ridotte.
- Range: 0 a 1
- Interpretazione: Valori più vicini a 1 suggeriscono una maggiore aderenza alla distribuzione normale. Valori significativamente bassi indicano la deviazione dalla normalità.

# Test di Shapiro-Wilk per la normalità dei dati nella variabile 'reb' (rimbalzi)
sf.test(df$reb)
## 
##  Shapiro-Francia normality test
## 
## data:  df$reb
## W = 0.98016, p-value = 1.758e-08

In sintesi, il risultato del test di Shapiro-Francia indica che i dati nella variabile df$reb non seguono una distribuzione normale. Questo è supportato dal valore basso del p-value, il quale suggerisce che la differenza tra la distribuzione dei dati e una distribuzione normale è statisticamente significativa.


Presentazione modello lineare

Modello: L’importanza dei rimbalzi

Abbiamo creato un modello lineare per esplorare come i rimbalzi influenzano le vittorie in NBA. L’idea è semplice: capire se squadre che rimbalzano meglio vincono di più. Il modello analizza diversi tipi di rimbalzi (offensivi, difensivi) e come questi si traducono in successo sul campo.

Formule

Le formule che usiamo si concentrano su diversi aspetti dei rimbalzi, come recuperare la palla dopo un tiro sbagliato o proteggere il canestro. Ogni formula ci dà un’idea di come le squadre gestiscono e sfruttano i rimbalzi durante le partite. L’obiettivo è vedere quale impatto hanno questi fattori sulle vittorie.

\(\text{Formula1} = \frac{\text{Rimbalzi offensivi in attacco}}{\text{Tiri sbagliati su azione}}\)

  • Formula 1: Efficienza nel Rimbalzo Offensivo
    Questa formula calcola la percentuale di rimbalzi offensivi catturati dalla squadra in seguito ai tiri mancati. Il numeratore, “Rimbalzi offensivi in attacco”, rappresenta il totale dei rimbalzi catturati dopo un tiro mancato dall’attacco. Il denominatore, “Tiri sbagliati su azione”, è il numero totale di tiri non riusciti dalla squadra. Il quoziente fornisce un indice diretto della competenza di una squadra nel mantenere il possesso della palla dopo un tentativo di tiro fallito, un aspetto cruciale per generare opportunità di punteggio aggiuntive.

\(\text{Formula2} = \frac{\text{Rimbalzi difensivi in difesa presi}}{\text{Tiri sbagliati su azione degli avversari}}\)

  • Formula 2: Competenza nel Rimbalzo Difensivo Questa formula misura l’efficacia della squadra nel recuperare i rimbalzi difensivi. Il numeratore, “Rimbalzi difensivi in difesa presi”, indica il totale dei rimbalzi catturati dalla squadra in difesa. Il denominatore, “Tiri sbagliati su azione degli avversari”, è il numero di tiri falliti dalla squadra avversaria. Il risultato fornisce un’indicazione quantitativa della capacità di una squadra di terminare l’attacco avversario e iniziare una transizione offensiva, elemento fondamentale per il controllo del flusso di gioco.

\(\text{Formula3} = \frac{\text{Palle riprese in attacco} + 1.5 \times \text{Palle riprese in difesa}}{\text{Palle perse in attacco} + 2 \times \text{Rimbalzi subiti in difesa}}\)

  • Formula 3: Bilancio Rimbalzi/Palle Perse Questa formula presenta un rapporto complesso, dove il numeratore somma “Palle riprese in attacco” (rimbalzi offensivi) e “Palle riprese in difesa” (rimbalzi difensivi) moltiplicate per 1.5, un fattore che sottolinea l’importanza dei rimbalzi difensivi. Il denominatore combina “Palle perse in attacco” e “Rimbalzi subiti in difesa” moltiplicati per 2, indicando le occasioni perse di recupero di rimbalzi. Questa formula è progettata per valutare la gestione globale dei rimbalzi da parte di una squadra, enfatizzando il valore della difesa rispetto all’attacco.

\(\text{Formula4} = (\text{Palle riprese in attacco - Palle perse in attacco}) + 1.5*(\text{Palle riprese in difesa - Palle perse in difesa})\)

  • Formula 4: Efficienza Rimbalzi Netta Questa formula calcola la differenza netta tra i rimbalzi catturati e quelli persi, sia in attacco che in difesa, applicando un coefficiente di 1.5 ai rimbalzi difensivi. Il calcolo evidenzia il saldo netto di rimbalzi catturati contro quelli persi, con un’enfasi aggiuntiva sulla componente difensiva. Questo indice fornisce una misura diretta dell’efficacia complessiva di una squadra nel dominare il gioco sui rimbalzi.

\(\text{Formula5} = \frac{(\frac{\text{Rimbalzi subiti in difesa}}{\text{Palle perse in difesa}})}{(\frac{\text{Rimbalzi subiti in attacco}}{\text{Palle perse in attacco}})}\)

  • Formula 5: Rapporto Rimbalzi/Palle Perse Questa formula offre un confronto tra l’effetto dei rimbalzi sulla perdita di palla in attacco e in difesa. Il numeratore rappresenta il rapporto tra “Rimbalzi subiti in difesa” e “Palle perse in difesa”, mentre il denominatore fa lo stesso per l’attacco. Questo rapporto mette in luce l’impatto dei rimbalzi sulle opportunità perse, sia in termini di difesa che di attacco.

\(\text{Formula6} = (\text{Rimbalzi ottenuti in attacco} + \text{Rimbalzi ottenuti in difesa}) - (\text{Rimbalzi subiti in difesa} - \text{Rimbalzi subiti in attacco})^2\)

  • Formula 6: Bilancio Complessivo Rimbalzi
    Questa formula calcola un indice che tiene conto sia dei rimbalzi ottenuti in attacco (Rimbalzi ottenuti in attacco) e in difesa (Rimbalzi ottenuti in difesa), sia dei rimbalzi subiti in difesa (Rimbalzi subiti in difesa) e in attacco (Rimbalzi subiti in attacco), elevando al quadrato la differenza tra i rimbalzi subiti. Offre una visione complessiva dell’efficacia della squadra nel controllo dei rimbalzi sotto entrambi i canestri.

\(\text{Formula7} = (\text{Efficienza nel Rimbalzo Offensivo} + \text{Competenza nel Rimbalzo Difensivo})^2\)

  • Formula 7: Sinergia Tra Rimbalzi Offensivi e Difensivi
    Combina le misurazioni dell’efficienza nei rimbalzi offensivi (Efficienza nel Rimbalzo Offensivo) e difensivi (Competenza nel Rimbalzo Difensivo), elevandone la somma al quadrato. Questo calcolo evidenzia l’importanza della sinergia tra le due componenti del gioco sui rimbalzi.

\(\text{Formula8} = \frac{\text{Rimbalzi ottenuti in attacco}}{\text{Totale rimbalzi in attacco}}\)

  • Formula 8: Proporzione Rimbalzi Offensivi
    Questa formula determina la percentuale dei rimbalzi offensivi (Rimbalzi ottenuti in attacco) sul totale dei rimbalzi in attacco (Totale rimbalzi in attacco). Fornisce un’indicazione diretta dell’efficienza di una squadra nel recuperare la palla dopo i tiri falliti in attacco.

\(\text{Formula9} = \left(\frac{\text{Rimbalzi ottenuti in attacco}}{\text{Rimbalzi subiti in attacco}}\right)^2\)

  • Formula 9: Predominanza dei Rimbalzi Offensivi
    Calcola il rapporto tra i rimbalzi offensivi ottenuti (Rimbalzi ottenuti in attacco) e i rimbalzi subiti in attacco (Rimbalzi subiti in attacco), elevato al quadrato. Questa formula enfatizza la capacità di una squadra di dominare sotto il proprio canestro in fase offensiva.

\(\text{Formula10} = \left(\frac{\text{Rimbalzi ottenuti in difesa}}{\text{Rimbalzi subiti in difesa}}\right)^2\)

  • Formula 10: Predominanza dei Rimbalzi Difensivi
    Analoga alla Formula 9, ma applicata al contesto difensivo. Misura il rapporto tra i rimbalzi difensivi ottenuti (Rimbalzi ottenuti in difesa) e i rimbalzi subiti in difesa (Rimbalzi subiti in difesa), elevato al quadrato. Sottolinea l’efficacia di una squadra nel proteggere il proprio canestro in fase difensiva.

Modello lineare sul dataframe train

Legenda significato acronimi:

  • o_oreb: Rimbalzi ottenuti in attacco
  • o_dreb: Rimbalzi subiti in attacco
  • o_reb: Totale rimbalzi in attacco
  • d_oreb: Rimbalzi subiti in difesa
  • d_dreb: Rimbalzi ottenuti in difesa
  • d_reb: Totale rimbalzi in difesa
# Definizione di nuove variabili
df$f1 <- (df$o_oreb) / (df$o_fga - df$o_fgm)
df$f2 <- (df$d_dreb) / (df$d_fga - df$d_fgm)
df$f3 <- (df$o_oreb + 1.5 * df$d_dreb) / (df$o_dreb + 2 * df$d_oreb)
df$f4 <- (df$o_oreb - df$o_dreb) + 1.5 * (df$d_dreb - df$d_oreb)
df$f5 <- (df$d_oreb / df$d_to) / (df$o_dreb / df$o_to)
df$f6 <- (df$o_oreb + df$d_dreb) - (df$d_oreb - df$o_dreb)^2
df$f7 <- (df$f1 + df$f2)^2
df$f8 <- (df$o_oreb) / (df$o_reb)
df$f9 <- ((df$o_oreb) / (df$o_dreb))^2
df$f10 <- ((df$d_dreb) / (df$d_oreb))^2

Divisione dataframe in train e test

Si esegue la divisione del dataframe df in un set di addestramento (train) e un set di test (test). La divisione è effettuata campionando casualmente il 70% delle righe per l’addestramento e utilizzando il restante 30% per il test. Successivamente, viene creato il modello lineare utilizzando le variabili predittive sopra create per prevedere la variabile di risposta won nel set di addestramento.

# Divisione in Test e Train per evitare che il modello fitti troppo bene sui nostri dati
sample <- sample(c(TRUE, FALSE), nrow(df), replace=TRUE, prob=c(0.7, 0.3))
df = subset(df, select = c("f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "won", "divID", "confID"))

train  <- df[sample, ]
test   <- df[!sample, ]

#ATTENZIONE: facendo il train sul valore delle variabili, questo significa che sono esse ad essere i nostri dati, non i rimbalzi in se.

# Creazione del modello lineare
linMod <- lm(won ~ f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10, data = train)
summary(linMod)
## 
## Call:
## lm(formula = won ~ f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + 
##     f10, data = train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -10.4087  -3.0609  -0.0298   3.0183  13.6902 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  9.402e+02  7.950e+01  11.827  < 2e-16 ***
## f1          -5.282e+02  1.337e+02  -3.950 8.76e-05 ***
## f2          -8.781e+02  1.427e+02  -6.152 1.42e-09 ***
## f3          -3.979e+02  3.350e+01 -11.878  < 2e-16 ***
## f4           6.751e-02  7.540e-03   8.953  < 2e-16 ***
## f5          -1.881e+02  4.711e+00 -39.935  < 2e-16 ***
## f6           1.087e-05  1.418e-06   7.665 7.51e-14 ***
## f7           3.872e+02  7.090e+01   5.461 7.03e-08 ***
## f8          -2.650e+02  7.022e+01  -3.774 0.000177 ***
## f9           5.248e+01  2.181e+01   2.406 0.016417 *  
## f10          4.287e+00  8.721e-01   4.915 1.15e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.513 on 583 degrees of freedom
## Multiple R-squared:  0.8752, Adjusted R-squared:  0.8731 
## F-statistic:   409 on 10 and 583 DF,  p-value: < 2.2e-16

Modello lineare normalizzato sul dataframe train

Normalizzazione

La normalizzazione dei dati è una pratica fondamentale nell’elaborazione di modelli statistici, specialmente nei modelli lineari. Questo processo è volto a standardizzare la scala delle variabili, rendendo più agevole il confronto tra di esse e migliorando l’efficienza dell’algoritmo di regressione. In particolare, la normalizzazione è cruciale quando le variabili hanno scale molto diverse, poiché ciò potrebbe influenzare negativamente la precisione del modello.

Nel codice R seguente, abbiamo normalizzato le variabili del nostro dataframe ‘df’, utilizzando la funzione scale. Questo assicura che ciascuna variabile contribuisca in modo equo al modello, permettendo una più accurata interpretazione dei coefficienti della regressione lineare.

# Normalizziamo le covariate
train$f1_z <- scale(train$f1)
train$f2_z <- scale(train$f2)
train$f3_z <- scale(train$f3)
train$f4_z <- scale(train$f4)
train$f5_z <- scale(train$f5)
train$f6_z <- scale(train$f6)
train$f7_z <- scale(train$f7)
train$f8_z <- scale(train$f8)
train$f9_z <- scale(train$f9)
train$f10_z <- scale(train$f10)

# Normalizzo i dati di test
test$f1_z <- scale(test$f1)
test$f2_z <- scale(test$f2)
test$f3_z <- scale(test$f3)
test$f4_z <- scale(test$f4)
test$f5_z <- scale(test$f5)
test$f6_z <- scale(test$f6)
test$f7_z <- scale(test$f7)
test$f8_z <- scale(test$f8)
test$f9_z <- scale(test$f9)
test$f10_z <- scale(test$f10)

linModNormalized <- lm(won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z + f7_z + f8_z + f9_z + f10_z, data = train)

Grafici

I quattro grafici rappresentano una diagnosi della regressione lineare condotta per studiare la relazione tra rimbalzi e vittorie.

  1. Il primo grafico “Residui Standardizzati” mostra la dispersione dei residui (differenze tra valori osservati e valori previsti dal modello) rispetto ai valori adattati.
  2. Il secondo grafico è un “Q-Q Plot dei Residui Standardizzati” che confronta la distribuzione dei residui con una distribuzione normale teorica.
  3. Il terzo grafico “Scale-Location” fornisce un controllo della eteroscedasticità (varianza non costante dei residui).
  4. Infine, il “Q-Q Plot dei Residui” con la distanza di Cook evidenzia l’influenza di ogni osservazione sulla stima dei parametri del modello.

Ecco cosa possiamo dedurre da questi grafici:

  1. Dall’analisi del primo grafico, si nota che i residui non sembrano seguire un pattern specifico rispetto ai valori adattati, indicando una buona casualità, nonostante la presenza di alcuni punti che deviano significativamente dalla linea rossa di nessuna autocorrelazione.
  2. Il Q-Q plot mostra una lieve deviazione dalla linea teorica, suggerendo una possibile presenza di coda pesante o outliers.
  3. Il grafico Scale-Location mostra segni di eteroscedasticità, dato che la dispersione dei residui cambia con i valori adattati.
  4. Infine, la distanza di Cook nel quarto grafico evidenzia alcune osservazioni con un’influenza superiore sulla stima dei parametri, suggerendo un’ulteriore indagine su questi punti per comprendere la loro influenzasul modello.

Test modello lineare

Il processo di test di un modello lineare è cruciale per assicurare la sua affidabilità e accuratezza. Questa fase prevede la valutazione di vari aspetti del modello, come l’adattamento dei dati, la normalità dei residui, l’omoschedasticità e la multicollinearità. Ognuno di questi test fornisce un’indicazione su come il modello si adatta ai dati e su eventuali problemi che potrebbero influenzarne le prestazioni.

Summary

Per una comprensione immediata del modello, è utile visualizzare il riepilogo tramite summary(linModNormalized). Questo fornisce dettagli sui coefficienti, la significatività statistica e altre metriche chiave.

summary (linModNormalized)
## 
## Call:
## lm(formula = won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z + 
##     f7_z + f8_z + f9_z + f10_z, data = train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -10.4087  -3.0609  -0.0298   3.0183  13.6902 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  41.2710     0.1852 222.901  < 2e-16 ***
## f1_z        -17.1478     4.3408  -3.950 8.76e-05 ***
## f2_z        -43.6955     7.1027  -6.152 1.42e-09 ***
## f3_z        -26.6688     2.2452 -11.878  < 2e-16 ***
## f4_z         18.9449     2.1159   8.953  < 2e-16 ***
## f5_z        -12.9229     0.3236 -39.935  < 2e-16 ***
## f6_z          5.6222     0.7335   7.665 7.51e-14 ***
## f7_z         33.4295     6.1219   5.461 7.03e-08 ***
## f8_z         -8.8056     2.3333  -3.774 0.000177 ***
## f9_z          3.3066     1.3740   2.406 0.016417 *  
## f10_z         6.2760     1.2768   4.915 1.15e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.513 on 583 degrees of freedom
## Multiple R-squared:  0.8752, Adjusted R-squared:  0.8731 
## F-statistic:   409 on 10 and 583 DF,  p-value: < 2.2e-16

R-quadrato

Il test R-quadrato misura la proporzione della varianza totale della variabile dipendente che viene spiegata dal modello di regressione. Un R-quadrato elevato indica che una grande parte della varianza nella variabile dipendente può essere spiegata dalle variabili indipendenti nel modello.
- Range: 0 a 1
- Interpretazione: 0 indica nessuna spiegazione della varianza da parte del modello. 1 indica una spiegazione completa della varianza da parte del modello.

summary_linModNormalized <- summary(linModNormalized)
r_squared <- summary_linModNormalized$r.squared
cat("R-quadro:", r_squared, "\n")
## R-quadro: 0.8752289

R-quadrato Adattato

Il R-quadrato adattato modifica il R-quadrato per tenere conto del numero di predittori nel modello. È più affidabile per i modelli con molteplici variabili indipendenti, poiché penalizza la complessità aggiuntiva, fornendo una misura più realistica della bontà di adattamento.
- Range: Può essere negativo, ma generalmente 0 a 1
- Interpretazione: Valori più vicini a 1 indicano una migliore spiegazione della varianza, considerando il numero di predittori.

n <- length(train$o_reb)
k <- length(linModNormalized$coefficients) - 1
adjusted_r_squared <- 1 - ((1 - r_squared) * (n - 1) / (n - k - 1))
cat("R-quadro adattato:", adjusted_r_squared, "\n")
## R-quadro adattato: 0.9886572

Test Shapiro

Il test di Shapiro-Wilk sui residui è utilizzato per valutare la normalità dei residui in un modello di regressione lineare. La normalità dei residui è un’assunzione critica in molti test statistici. Se i residui non seguono una distribuzione normale, le inferenze sulle stime dei parametri potrebbero essere invalide.
- Range: 0 a 1
- Interpretazione: Valori più vicini a 1 suggeriscono una maggiore probabilità che i residui seguano una distribuzione normale.

shapiro.test(residuals(linModNormalized))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(linModNormalized)
## W = 0.99496, p-value = 0.04877

Test di omoschedasticità

Il test di Breusch-Pagan verifica l’assunzione di omoschedasticità (varianza costante) dei residui in un modello di regressione. La presenza di eteroschedasticità (varianza non costante) nei residui può portare a stime inefficaci e test statistici non affidabili.
- Range: 0 a \(+\infty\)
- Interpretazione: Valori più alti indicano una maggiore probabilità di eteroschedasticità. Si confronta il valore del test con un valore critico (ad es., da una distribuzione chi-quadrato) per determinare la significatività.

bptest(linModNormalized)
## 
##  studentized Breusch-Pagan test
## 
## data:  linModNormalized
## BP = 19.869, df = 10, p-value = 0.03051

Test di multicollinearità

Il test di multicollinearità verifica se esiste una correlazione elevata tra le variabili indipendenti in un modello di regressione lineare. La multicollinearità può causare problemi nella stima dei coefficienti del modello, rendendo difficili l’interpretazione e la significatività statistica delle variabili indipendenti. Strumenti comuni per rilevarla includono il fattore di inflazione della varianza (VIF) e l’indice di tolleranza.
- Range del VIF: 1 a \(+\infty\)
- Interpretazione: 1 indica assenza di multicollinearità. Valori superiori a 5 o 10 sono spesso considerati indicatori di multicollinearità significativa.

car::vif(linModNormalized)
##        f1_z        f2_z        f3_z        f4_z        f5_z        f6_z 
##  548.705092 1469.083074  146.801434  130.377933    3.049488   15.666977 
##        f7_z        f8_z        f9_z       f10_z 
## 1091.364418  158.543470   54.977852   47.473671

Rimozione outliers e LASSO

Nel perfezionare i modelli statistici, la gestione degli outliers è cruciale. Gli outliers possono distorcere significativamente i risultati e portare a stime dei parametri poco affidabili. La loro rimozione o adeguato trattamento è fondamentale per aumentare la precisione del modello. Tale processo non solo migliora la validità delle inferenze statistiche ma anche la capacità del modello di generalizzare a dati non osservati.

Parallelamente, tecniche di regolarizzazione come LASSO (Least Absolute Shrinkage and Selection Operator) si rivelano preziose. LASSO penalizza la grandezza assoluta dei coefficienti di regressione, con l’effetto diretto di ridurre il sovradimensionamento (overfitting) e favorire la selezione delle variabili. Attraverso la contrazione dei coefficienti verso zero, LASSO contribuisce a escludere predittori non informativi, affinando il modello sui fattori più rilevanti.

Incorporando LASSO, possiamo quindi affrontare due problematiche fondamentali: la riduzione della complessità del modello e l’incremento dell’interpretabilità dei dati. La rimozione degli outliers, combinata con l’approccio selettivo di LASSO, è una strategia potente per migliorare la robustezza e l’efficacia del nostro modello lineare, ottimizzando la correlazione tra i rimbalzi e le vittorie.

Identificazione degli Outliers

La prima fase nel perfezionamento del modello implica l’identificazione accurata degli outliers. Per questa operazione, adottiamo un grafico di influenza, uno strumento grafico che mette in evidenza le osservazioni che esercitano un’influenza eccessiva sulla stima dei parametri.

Valutiamo i residui rispetto ai valori predetti e definiamo come outliers quegli osservazioni la cui deviazione dalla media supera un limite prefissato, che in questo contesto è stabilito a due deviazioni standard.

# Calcola i residui dal modello di regressione lineare normalizzato
residui <- residuals(linModNormalized)

# Definisci una soglia per gli outlier
soglia_outlier <- 2
outliers <- which(abs(residui) > soglia_outlier*sd(residui))

# Identifica gli outlier basati sulla soglia definita
outliers <- which(abs(residui) > soglia_outlier * sd(residui))
outliers
##  440  470  519  638  651  822  885  900  914  940  957 1026 1055 1128 1139 1161 
##    2   27   56  140  151  278  318  329  337  353  364  391  410  461  470  487 
## 1181 1196 1205 1224 1270 
##  506  519  526  537  566

Rimozione degli Outliers

Identificati gli outliers, procediamo con la loro esclusione dal dataset utilizzato per l’addestramento del modello. Tale rimozione mira a migliorare la robustezza e la generalizzabilità del modello.

# Rimuovi gli outliers e ricrea il modello lineare normalizzato
if (length(outliers) != 0) {
  train_1 <- train[-outliers,]
} else {
  train_1 <- train  # questo è il caso in cui non siano presenti outliers
}

# ATTENZIONE: facendo il train sul valore delle variabili, questo significa 
# che sono esse ad essere i nostri dati, non i rimbalzi in sé.

Confronto dei Modelli Prima e Dopo la Rimozione degli Outliers

Il confronto tra i modelli prima e dopo l’eliminazione degli outliers è vitale per valutare l’efficacia di questo intervento. Analizziamo i riepiloghi statistici del modello per discernere le variazioni nelle performance.

Prima della Rimozione degli Outliers:

Si esamina il sommario del modello originale per stabilire un benchmark delle prestazioni.

## 
## Call:
## lm(formula = won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z + 
##     f7_z + f8_z + f9_z + f10_z, data = train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -10.4087  -3.0609  -0.0298   3.0183  13.6902 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  41.2710     0.1852 222.901  < 2e-16 ***
## f1_z        -17.1478     4.3408  -3.950 8.76e-05 ***
## f2_z        -43.6955     7.1027  -6.152 1.42e-09 ***
## f3_z        -26.6688     2.2452 -11.878  < 2e-16 ***
## f4_z         18.9449     2.1159   8.953  < 2e-16 ***
## f5_z        -12.9229     0.3236 -39.935  < 2e-16 ***
## f6_z          5.6222     0.7335   7.665 7.51e-14 ***
## f7_z         33.4295     6.1219   5.461 7.03e-08 ***
## f8_z         -8.8056     2.3333  -3.774 0.000177 ***
## f9_z          3.3066     1.3740   2.406 0.016417 *  
## f10_z         6.2760     1.2768   4.915 1.15e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.513 on 583 degrees of freedom
## Multiple R-squared:  0.8752, Adjusted R-squared:  0.8731 
## F-statistic:   409 on 10 and 583 DF,  p-value: < 2.2e-16

Dopo la Rimozione degli Outliers:

Una volta esclusi gli outliers, ricostruiamo il modello e esaminiamo nuovamente il grafico di influenza per osservare come l’eliminazione abbia modificato l’impatto delle osservazioni sui parametri stimati.

## 
## Call:
## lm(formula = won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z + 
##     f7_z + f8_z + f9_z + f10_z, data = train_1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.8554 -2.9341  0.0274  2.9538  9.1507 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  41.1409     0.1703 241.580  < 2e-16 ***
## f1_z        -11.4749     4.1548  -2.762  0.00594 ** 
## f2_z        -36.8426     6.7736  -5.439 8.00e-08 ***
## f3_z        -28.5534     2.0833 -13.706  < 2e-16 ***
## f4_z         21.2705     1.9843  10.719  < 2e-16 ***
## f5_z        -12.9692     0.2987 -43.421  < 2e-16 ***
## f6_z          6.3263     0.6917   9.147  < 2e-16 ***
## f7_z         26.6238     5.8687   4.537 6.99e-06 ***
## f8_z        -10.5230     2.1459  -4.904 1.23e-06 ***
## f9_z          3.8484     1.2555   3.065  0.00228 ** 
## f10_z         6.9138     1.1721   5.898 6.34e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.074 on 562 degrees of freedom
## Multiple R-squared:  0.8957, Adjusted R-squared:  0.8939 
## F-statistic: 482.8 on 10 and 562 DF,  p-value: < 2.2e-16

Grafico di Influenza:

Il grafico aggiornato sarà indicativo delle modifiche nella distribuzione dei residui e dell’influenza degli outliers sulla stima dei parametri.

Visualizzazione Residui e Leverage

Questo blocco di codice utilizza la funzione ols_plot_resid_lev per visualizzare la relazione tra i residui e il leverage per entrambi i modelli lineari (prima e dopo la rimozione degli outliers). Questa visualizzazione aiuta a identificare ulteriori punti influenti o pattern nei residui che potrebbero influenzare le prestazioni del modello.

Risultati

Entrambi i modelli mostrano prestazioni simili, spiegando circa l’84% della varianza nella variabile dipendente “won”. Tuttavia, la rimozione degli outliers ha leggermente migliorato i risultati.

Implementazione del Modello LASSO per l’Ottimizzazione della Regressione

Il modello LASSO (Least Absolute Shrinkage and Selection Operator) viene utilizzato per migliorare la qualità predittiva e l’interpretabilità di modelli di regressione statistica attraverso la selezione di variabili e la regolarizzazione. Il suo impiego è particolarmente vantaggioso per affrontare problemi di overfitting e per identificare i predittori più rilevanti, consentendo al modello di mantenere robustezza e precisione anche su dati non inclusi nella fase di addestramento.

1. Preparazione e Valutazione del Modello di Regressione LASSO

Per implementare il modello LASSO, seguiamo un processo meticoloso che inizia con la definizione chiara della variabile risposta e la selezione accurata delle variabili predittive. Procediamo quindi con una cross-validation k-fold, un metodo rigoroso per determinare il valore ottimale del parametro di regolarizzazione lambda, che equilibra complessità e capacità predittiva del modello.

# Impostazione del contesto per il metodo di regressione LASSO con cross-validation per selezionare il valore lambda più efficace.

# Definizione della variabile risposta
y <- train_1$won

# Creazione della matrice dei predittori, selezionando le features di interesse
x <- data.matrix(train_1[, c("f1_z", "f2_z", "f3_z", "f4_z", "f5_z", "f6_z", "f7_z", "f8_z", "f9_z", "f10_z")])

# Applicazione della cross-validation k-fold per identificare il lambda ottimale
cv_model <- cv.glmnet(x, y, alpha = 1)

# Estrazione del valore di lambda che minimizza il Mean Squared Error sul test set
best_lambda <- cv_model$lambda.min

Questo è il grafico di tutti i valori possibili di lambda.

## [1] "Lambda migliore: 0.0038"

Allenamento modello LASSO

# Allenamento del modello LASSO con il parametro lambda identificato
cv_model <- cv.glmnet(x, y)

Dopo aver individuato il valore di lambda che minimizza l’errore quadratico medio, procediamo all’addestramento del modello LASSO. Esaminiamo i coefficienti risultanti per valutare l’importanza assegnata a ciascuna variabile predittiva, offrendo così una visione quantitativa dell’impatto di ogni feature sulle vittorie della squadra.

# Fittiamo il modello con il miglior lambda (penalizzazione)
best_model <- glmnet(x, y, alpha = 1, lambda = best_lambda)

# Stampa i coefficienti del modello LASSO
coef(best_model)
## 11 x 1 sparse Matrix of class "dgCMatrix"
##                     s0
## (Intercept)  41.136301
## f1_z          .       
## f2_z        -16.988910
## f3_z        -25.853305
## f4_z         18.161305
## f5_z        -12.932806
## f6_z          5.347036
## f7_z          9.535265
## f8_z        -10.602201
## f9_z          5.027732
## f10_z         5.383088
# Stampa il summary del modello lineare normalizzato precedente per confronto
summary(linModNormalized_1)
## 
## Call:
## lm(formula = won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z + 
##     f7_z + f8_z + f9_z + f10_z, data = train_1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.8554 -2.9341  0.0274  2.9538  9.1507 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  41.1409     0.1703 241.580  < 2e-16 ***
## f1_z        -11.4749     4.1548  -2.762  0.00594 ** 
## f2_z        -36.8426     6.7736  -5.439 8.00e-08 ***
## f3_z        -28.5534     2.0833 -13.706  < 2e-16 ***
## f4_z         21.2705     1.9843  10.719  < 2e-16 ***
## f5_z        -12.9692     0.2987 -43.421  < 2e-16 ***
## f6_z          6.3263     0.6917   9.147  < 2e-16 ***
## f7_z         26.6238     5.8687   4.537 6.99e-06 ***
## f8_z        -10.5230     2.1459  -4.904 1.23e-06 ***
## f9_z          3.8484     1.2555   3.065  0.00228 ** 
## f10_z         6.9138     1.1721   5.898 6.34e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.074 on 562 degrees of freedom
## Multiple R-squared:  0.8957, Adjusted R-squared:  0.8939 
## F-statistic: 482.8 on 10 and 562 DF,  p-value: < 2.2e-16

2. Valutazione Comparativa delle Previsioni: LASSO contro Modello Lineare

Il confronto delle previsioni generate dal modello LASSO e da un modello lineare classico ci permette di valutare l’efficacia di ciascun approccio nel contesto specifico dei nostri dati. Utilizziamo i dati di test per misurare la precisione predittiva e confrontiamo le metriche chiave come l’errore quadratico medio (RMSE) e le performance di classificazione.

# Questo codice esegue stime usando un modello Lasso e un modello lineare (LM) su un set di dati di test e ne valuta le prestazioni utilizzando l'errore quadratico medio (RMSE) e le metriche    di classificazione binaria, ad esempio matrice di confusione, accuratezza, precisione, sensibilità, punteggio F e specificità.

# Predizioni utilizzando il modello Lasso
new <- data.matrix(test[, c("f1_z", "f2_z", "f3_z", "f4_z", "f5_z", "f6_z", "f7_z", "f8_z", "f9_z", "f10_z")])
prevLasso <- predict(best_model, s = best_lambda, newx = new)

# Predizioni utilizzando il modello LM (Linear Model)
new <- subset(test, select = c("f1_z", "f2_z", "f3_z", "f4_z", "f5_z", "f6_z", "f7_z", "f8_z", "f9_z", "f10_z"))
prevLM <- predict(linModNormalized_1, newdata = new)

Confrontando i risultati ottenuti dai due modelli, possiamo apprezzare l’efficacia del LASSO nell’affrontare la complessità e il potenziale overfitting. La selezione di variabili intrinseca al LASSO si rivela particolarmente utile quando il numero di predittori è elevato rispetto al numero di osservazioni. Questo approccio non solo semplifica il modello, riducendo i predittori ai soli fattori significativi, ma migliora anche la chiarezza interpretativa dei risultati, un aspetto fondamentale nella comunicazione delle scoperte a un pubblico più ampio.

In sintesi, il modello LASSO offre un equilibrio ottimale tra complessità del modello e capacità predittiva, rendendolo uno strumento prezioso nella nostra analisi statistica.

3. Valutazione delle Prestazioni del Modello

Confrontiamo le prestazioni di entrambi i modelli (LASSO e lineare) attraverso diverse metriche.

  • Calcolo del RMS (Root Mean Square)
    Questi blocchi di codice calcolano il RMS, una misura dell’errore di previsione, per il modello LASSO e il modello lineare (LM). Il RMS fornisce una stima dell’errore quadratico medio tra i valori previsti e i valori reali.
# Calcolo dell'Errore Quadratico Medio (RMSE) per il modello Lasso
rmsLasso <- sqrt(mean((test$won - prevLasso)^2))

# Calcolo dell'Errore Quadratico Medio (RMSE) per il modello LM (Linear Model)
rmsLM <- sqrt(mean((test$won - prevLM)^2))
  • Previsioni Binarie e Matrice di Confusione
    Convertiamo le previsioni del modello LASSO in valori binari (0 o 1) e generiamo una matrice di confusione per confrontare le previsioni con i valori reali. Questo passaggio è utile per valutare la classificazione effettuata dal modello.
# Classificazione binaria utilizzando una soglia (0.5) per le predizioni del modello Lasso
prev <- ifelse(prevLasso > 0.5, "1", "0")
prev <- as.factor(prev)

# Matrice di Confusione per le predizioni del modello Lasso
confMatrix <- table(prev, test$won)

Calcolo delle Metriche di Valutazione

Calcoliamo diverse metriche di valutazione come l’accuratezza (accuracy), la precisione (precision), la sensibilità (sensitivity), l’F-score e la specificità (specificity). Queste metriche forniscono una valutazione complessiva dell’efficacia del modello.

Ecco come interpretarle:

  • Accuracy (Accuratezza):
    • Significato: La proporzione di previsioni corrette (sia positive che negative) rispetto al totale delle previsioni.
    • Interpretazione: Un valore elevato indica che il modello è generalmente accurato nel classificare sia le istanze positive che quelle negative. Tuttavia, in contesti con classi sbilanciate, una alta accuracy può essere fuorviante.
  • Precision (Precisione):
    • Significato: La proporzione di previsioni positive corrette rispetto al totale delle previsioni positive fatte dal modello.
    • Interpretazione: Misura la qualità delle previsioni positive del modello. Una alta precisione indica che una grande percentuale delle previsioni positive del modello è effettivamente corretta.
  • Sensitivity (Sensibilità) o Recall:
    • Significato: La proporzione di veri positivi rispetto al totale delle istanze effettivamente positive.
    • Interpretazione: Indica quanto bene il modello è in grado di identificare le istanze positive. Un valore alto significa che il modello cattura bene la maggior parte delle istanze positive.
  • F-score:
    • Significato: Una media armonica di precision e sensitivity.
    • Interpretazione: Combina la precisione e la sensibilità in un singolo numero. È utile quando si desidera un equilibrio tra precisione e sensibilità, specialmente in contesti con distribuzioni di classe disuguali.
  • Specificity (Specificità):
    • Significato: La proporzione di veri negativi rispetto al totale delle istanze effettivamente negative.
    • Interpretazione: Misura quanto bene il modello è in grado di identificare le istanze negative. Una alta specificità indica che il modello è efficace nel riconoscere le istanze non positive.
  • RMSE (Root Mean Square Error):
    • Significato: La radice quadrata della media degli errori al quadrato.
    • Interpretazione: Fornisce una misura della differenza tra i valori previsti dal modello e i valori osservati. A differenza delle altre metriche, il RMSE è sensibile agli outliers. Un valore basso di RMSE indica una maggiore precisione del modello nelle previsioni.
# Metriche di Performance
accuracy <- sum(confMatrix[1], confMatrix[4]) / sum(confMatrix[1:4])
precision <- confMatrix[4] / sum(confMatrix[4], confMatrix[2])
sensitivity <- confMatrix[4] / sum(confMatrix[4], confMatrix[3])
fscore <- (2 * (sensitivity * precision)) / (sensitivity + precision)
specificity <- confMatrix[1] / sum(confMatrix[1], confMatrix[2])
## [1] "Accuratezza: 0.5714"
## [1] "Precisione: 0.6"
## [1] "Sensibilità: 0.75"
## [1] "F-Score: 0.6667"
## [1] "Specificità: 0.3333"
## [1] "RMS Lasso: 5.7272"
## [1] "RMS Modello Lineare: 6.2143"

Analisi della Varianza (ANOVA) per Valutazione di Fattori Categorici

L’analisi della varianza (ANOVA) è un metodo statistico utilizzato per testare le differenze tra le medie di diverse categorie e può essere particolarmente utile per valutare l’impatto di variabili categoriche su una variabile di risposta continua. In questo segmento del report, eseguiamo il test ANOVA per determinare l’efficacia di due variabili categoriche, ‘confID’ e ‘divID’, come predittori delle vittorie.

Analisi dell’Effetto della Variabile ‘confID’

Per iniziare, esploriamo l’influenza della variabile ‘confID’, che rappresenta la conferenza a cui appartiene una squadra, sulla variabile dipendente ‘won’, che indica il numero di vittorie.

# Esecuzione del test ANOVA per esaminare l'impatto della variabile 'confID'
resp_conf <- anova(lm(won ~ confID, data = train_1))

# Stampa dei risultati con interpretazione condizionale
if (resp_conf["confID", "Pr(>F)"] < 0.05) {
  print("L'ipotesi nulla è respinta: la variabile 'confID' ha un effetto significativo sulle vittorie.")
} else {
  print("L'ipotesi nulla è accettata: non si rileva un effetto significativo della variabile 'confID' sulle vittorie.")
}
## [1] "L'ipotesi nulla è accettata: non si rileva un effetto significativo della variabile 'confID' sulle vittorie."

Esame dell’Effetto della Variabile ‘divID’

Successivamente, esaminiamo il potenziale impatto della variabile ‘divID’, che designa la divisione di una squadra, sempre sulla variabile ‘won’.

# Esecuzione del test ANOVA per valutare l'impatto della variabile 'divID'
resp_div <- anova(lm(won ~ divID, data = train_1))

# Decisione basata sui risultati del test e impostazione della variabile logica
if (resp_div["divID", "Pr(>F)"] < 0.05) {
  print("L'ipotesi nulla è respinta: la variabile 'divID' ha un effetto significativo sulle vittorie.")
  div <- TRUE
} else {
  print("L'ipotesi nulla è accettata: non emerge un effetto significativo della variabile 'divID' sulle vittorie.")
  div <- FALSE
}
## [1] "L'ipotesi nulla è accettata: non emerge un effetto significativo della variabile 'divID' sulle vittorie."

Analisi degli Effetti di Interazione

Nella modellizzazione statistica, gli effetti di interazione tra variabili possono rivelare dinamiche complesse e influenze reciproche che non sono apprezzabili quando le variabili sono considerate isolatamente. Questa sezione è dedicata alla costruzione di un modello lineare che incorpora tali effetti di interazione, permettendo di comprendere meglio come le combinazioni di fattori influenzino il numero di vittorie.

Costruzione del Modello con Effetti di Interazione

La decisione di includere gli effetti di interazione nel modello dipende dall’analisi preliminare svolta sulla variabile div. Se div si rivela significativa, la includeremo nel modello; in caso contrario, la escluderemo.

# Verifica del valore di 'div' per costruire il modello appropriato
if (div) {
  linModNormalized1 <- lm(won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z + f7_z + f8_z + f9_z + f10_z + divID + f1_z:f2_z + f4_z:divID, data = train_1)
} else {
  linModNormalized1 <- lm(won ~ f1_z + f2_z + f3_z + f4_z + f5_z + f6_z + f7_z + f8_z + f9_z + f10_z + f1_z:f2_z + f4_z:divID, data = train_1)
}

# Estrazione del riassunto del modello
riassunto <- summary(linModNormalized1)

Selezione delle Interazioni Significative

Una volta costruito il modello, procediamo all’identificazione delle interazioni significative. Utilizziamo i p-value per determinare quali effetti di interazione meritano di essere inclusi nel modello.

# Estrazione dei nomi delle righe dal riassunto del modello
nomi_righe <- rownames(riassunto$coefficients)

# Nomi delle righe da escludere
nomi_da_escludere <- c("(Intercept)", "f1_z:f2_z", "f4_z:divIDCD", "f4_z:divIDMW", "f4_z:divIDNW", "f4_z:divIDPC", "f4_z:divIDSE", "f4_z:divIDSW", "divIDCD", "divIDMW", "divIDNW", "divIDPC", "divIDSE", "divIDSW")

# Creazione di un vettore con i nomi delle righe da utilizzare
nomi_righe_da_utilizzare <- setdiff(nomi_righe, nomi_da_escludere)

# Aggiunta della variabile 'divID' se presente nei nomi delle righe
if ("divIDCD" %in% nomi_righe) {
  nomi_righe_da_utilizzare <- append(nomi_righe_da_utilizzare, c("divID"))
}

# Indici di inizio e fine per le p-values della variabile 'divID'
div_indice_inizio <- which(rownames(riassunto$coefficients) == "f4_z:divIDCD")
div_indice_fine <- which(rownames(riassunto$coefficients) == "f4_z:divIDSW")

# Estrazione delle p-values della variabile 'divID'
div_p_values <- riassunto$coefficients[div_indice_inizio:div_indice_fine, "Pr(>|t|)"]

# Aggiunta di 'f4_z:divID' se la media delle p-values è inferiore a 0.05
if (mean(div_p_values) < 0.05) {
  variabili <- append(nomi_righe_da_utilizzare, c("f4_z:divID"))
}

# Aggiunta di 'f1_z:f2_z' se la sua p-value è inferiore a 0.05
if (riassunto$coefficients["f1_z:f2_z", "Pr(>|t|)"] < 0.05) {
  variabili <- append(nomi_righe_da_utilizzare, c("f1_z:f2_z"))
}

# Se nessuna delle condizioni precedenti è soddisfatta, utilizza solo le variabili esistenti
if (!(mean(div_p_values) < 0.05) && !(riassunto$coefficients["f1_z:f2_z", "Pr(>|t|)"] < 0.05)) {
  variabili <- nomi_righe_da_utilizzare
}

# Creazione della formula significativa per il modello
formula_significativa <- as.formula(paste("won ~", paste(variabili, collapse = " + ")))

L’analisi dettagliata degli effetti di interazione ci permette di affinare il modello lineare, migliorando la nostra comprensione di come le variabili interagiscono tra loro e il loro impatto collettivo sulle vittorie. La selezione attenta di queste interazioni è fondamentale, poiché modella la realtà di come i fattori di gioco si influenzano reciprocamente in maniere non sempre intuitivamente prevedibili.

Rifinitura e Valutazione del Modello Finale

Dopo aver selezionato gli effetti di interazione rilevanti, rifiniamo il modello includendo solo quelle interazioni che hanno dimostrato una significatività statistica, portando a un modello più snello e potenzialmente più potente.

# Costruzione del nuovo modello lineare con la formula significativa
linModNormalized1 <- lm(formula_significativa, data = train_1)

# Visualizzazione del riassunto del nuovo modello
summary(linModNormalized1)
## 
## Call:
## lm(formula = formula_significativa, data = train_1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.7980 -2.9197 -0.0247  2.8919  9.0392 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  40.9018     0.1935 211.388  < 2e-16 ***
## f1_z        -13.9552     4.2465  -3.286  0.00108 ** 
## f2_z        -39.7070     6.8327  -5.811 1.04e-08 ***
## f3_z        -27.4355     2.1186 -12.950  < 2e-16 ***
## f4_z         20.5022     1.9973  10.265  < 2e-16 ***
## f5_z        -12.9778     0.2972 -43.662  < 2e-16 ***
## f6_z          5.7987     0.7185   8.071 4.26e-15 ***
## f7_z         29.3240     5.9344   4.941 1.03e-06 ***
## f8_z        -10.1573     2.1401  -4.746 2.63e-06 ***
## f9_z          3.8755     1.2494   3.102  0.00202 ** 
## f10_z         5.8672     1.2360   4.747 2.62e-06 ***
## f1_z:f2_z    -0.5080     0.1985  -2.560  0.01074 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.054 on 561 degrees of freedom
## Multiple R-squared:  0.8969, Adjusted R-squared:  0.8949 
## F-statistic: 443.9 on 11 and 561 DF,  p-value: < 2.2e-16

Esplorazione del Modello di Regressione di Poisson

Nell’ambito degli studi statistici, la regressione di Poisson può offrire una prospettiva alternativa e talvolta più adeguata per la modellazione di variabili di conteggio, come il numero di vittorie in un contesto sportivo. Pertanto, esploriamo la possibilità di utilizzare un modello di regressione generalizzata di Poisson per confrontare la sua efficacia con quella del modello lineare già sviluppato.

Costruzione del Modello di Poisson

Il modello di Poisson è particolarmente adatto per dati che descrivono il conteggio di eventi che si verificano in uno spazio o in un intervallo di tempo definiti. In questo caso, il numero di vittorie può essere adatto per tale modellizzazione, presupponendo che i dati si conformino alla distribuzione di Poisson.

# Questo codice addestra un modello di regressione generalizzata di Poisson (linModNormalized2_pois) utilizzando la stessa specifica del modello lineare (linModNormalized2). Successivamente,    vengono ottenuti e combinati i coefficienti di entrambi i modelli in un unico dataframe per una facile comparazione.

# Creazioni di un modello di regressione generalizzata di Poisson
linModNormalized1_pois = glm(formula_significativa, family=poisson(link=log), data = train_1)
summary(linModNormalized1_pois)
## 
## Call:
## glm(formula = formula_significativa, family = poisson(link = log), 
##     data = train_1)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  3.671011   0.007702 476.625  < 2e-16 ***
## f1_z         0.191160   0.173075   1.104 0.269379    
## f2_z        -0.221715   0.278592  -0.796 0.426124    
## f3_z        -0.809280   0.084585  -9.568  < 2e-16 ***
## f4_z         0.635099   0.081086   7.832 4.78e-15 ***
## f5_z        -0.326127   0.011671 -27.943  < 2e-16 ***
## f6_z         0.156857   0.026872   5.837 5.31e-09 ***
## f7_z         0.018845   0.244324   0.077 0.938519    
## f8_z        -0.307713   0.081633  -3.769 0.000164 ***
## f9_z         0.116091   0.048338   2.402 0.016322 *  
## f10_z        0.182444   0.046892   3.891 9.99e-05 ***
## f1_z:f2_z   -0.002991   0.007687  -0.389 0.697204    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 2310.66  on 572  degrees of freedom
## Residual deviance:  309.75  on 561  degrees of freedom
## AIC: 3488.2
## 
## Number of Fisher Scoring iterations: 4

Confronto dei Coefficienti dei Modelli Lineare e di Poisson

Per un’analisi comparativa, estraiamo i coefficienti dai modelli lineare e di Poisson. È importante notare che i coefficienti del modello di Poisson vengono esponenziati per facilitarne l’interpretazione nel contesto del modello log-lineare.

# Ottenimento dei coefficienti per ambo i modelli
normal = coefficients(linModNormalized1)
poisson = exp(coefficients(linModNormalized1_pois))

# Combinazione dei coefficienti in un unico dataframe
coefficients_table <- cbind(normal, poisson)

coefficients_table
##                 normal    poisson
## (Intercept)  40.901824 39.2916202
## f1_z        -13.955249  1.2106529
## f2_z        -39.706967  0.8011436
## f3_z        -27.435456  0.4451787
## f4_z         20.502203  1.8872094
## f5_z        -12.977848  0.7217135
## f6_z          5.798736  1.1698287
## f7_z         29.324024  1.0190238
## f8_z        -10.157331  0.7351264
## f9_z          3.875470  1.1230976
## f10_z         5.867216  1.2001471
## f1_z:f2_z    -0.508048  0.9970136

Considerazioni Generali:

È importante notare che gli effetti delle variabili possono essere interpretati in modo diverso a seconda della distribuzione scelta per il modello. La scelta tra distribuzione normale e di Poisson dipende dalla natura della tua variabile dipendente e dai tuoi obiettivi di modellazione. Nel contesto di modelli di regressione, è sempre buona pratica verificare l’adeguatezza del modello esaminando i residui, eseguendo test diagnostici e valutando la bontà di adattamento. L’interpretazione dei coefficienti dovrebbe essere fatta considerando la scala appropriata per la distribuzione utilizzata (lineare per la normale, logaritmica per la Poisson). Se stai cercando di prevedere il numero di vittorie, la distribuzione di Poisson potrebbe essere più appropriata per variabili conteggio come questa. Tuttavia, è sempre necessario verificare l’adeguatezza del modello ai dati specifici.


Conclusioni